package gestionnaires;  
 /*
 * @author Julien Bellaiche
 * @author Romain Louveau
 */

import java.util.Collection;  
import javax.ejb.Stateless;  
import javax.persistence.EntityManager;  
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;  
import javax.persistence.Query;
import java.util.ArrayList;
import java.util.Iterator;
import javax.ejb.EJB;
import modeles.Acteur;
import modeles.Disque;
import modeles.Realisateur;
import gestionnaires.GestionnaireActeurs;
  
@Stateless  
public class GestionnaireDisques {  
    // Ici injection de code : on n'initialise pas. L'entity manager sera créé  
    // à partir du contenu de persistence.xml  
    @PersistenceContext
    private EntityManager em;
    @EJB
   GestionnaireActeurs gestionnaireActeurs;
    @EJB
   GestionnaireRealisateurs gestionnaireRealisateurs;
    
    
    //Collection<Genre> genres = new ArrayList();
  //DString titre, final String realisateur, final String genre, final String pochette, final Double prix
    
    
                Collection<Acteur> acteur = new ArrayList();
                Collection<Acteur> acteur1 = new ArrayList();
                Collection<Realisateur> realisateur = new ArrayList();
                Collection<Realisateur> realisateur1 = new ArrayList();
                Collection<Acteur> matrixActs = new ArrayList<Acteur>();
                Collection<Realisateur> matrixReals = new ArrayList<Realisateur>();
                Collection<Acteur> acteurs = new ArrayList();
                Collection<Acteur> acteurs2 = new ArrayList();
                Collection<Acteur> acteurs3 = new ArrayList();
                Collection<Acteur> acteurs4 = new ArrayList();
                
    public void creerDisquesDeTest() {  
        
                /*matrixActs.add(gestionnaireActeurs.getActeurByNom("Reeves"));
                matrixReals.add(gestionnaireRealisateurs.getRealisateurByNom("Wachowski"));
        
                
                
                
                ArrayList<Acteur> alienAct = new ArrayList<Acteur>();
                ArrayList<Realisateur> alienReals = new ArrayList<Realisateur>();
                
                alienAct.add(gestionnaireActeurs.getActeurByNom("Weaver"));
                alienReals.add(gestionnaireRealisateurs.getRealisateurByNom("Scott"));
        
                //acteur.add(gestionnaireActeurs.getActeurByNom("Reeves"));
                //acteur1.add(gestionnaireActeurs.getActeurByNom("coucou"));
                //realisateur.add(gestionnaireRealisateurs.getRealisateurByNom("blabla"));
                //realisateur1.add(gestionnaireRealisateurs.getRealisateurByNom("sdfsdfs"));
                creeDisques("Matrix", matrixReals,"SF", "upload/pochettes/matrix.jpg",matrixActs, 9.99);
                //creeDisques("Alien",alienReals,"SF","upload/pochettes/alien.jpg",alienAct,7.50);*/
                acteurs.add(gestionnaireActeurs.getActeurByNom("Jason"));
                acteurs2.add(gestionnaireActeurs.getActeurByNom("Natalya"));
                
                realisateur.add(gestionnaireRealisateurs.getRealisateurByNom("Jason"));
                realisateur1.add(gestionnaireRealisateurs.getRealisateurByNom("Natalya"));
                
                creeDisques("Matrix",realisateur,"SF", "upload/pochettes/matrix.jpg",acteurs, 9.99);
                creeDisques("Alien",realisateur1,"SF","upload/pochettes/alien.jpg",acteurs2,7.50);
       /*  creeDisques("Matrix", "Wachowski", "SF", "upload/pochettes/matrix.jpg","test", 44.5);
        creeDisques("Matrix2", "Wachowski", "SF", "upload/pochettes/matrix2.jpg","test", 44.5);  
        creeDisques("Matrix3", "Wachowski", "SF", "upload/pochettes/matrix3.jpg","test", 44.5);  
        creeDisques("40 Jours 40 Nuits", "Michael Lehmann", "Comedie", "upload/pochettes/40j40n.jpg","test", 44.5);
        creeDisques("Projet X", "Lennon", "SF", "upload/pochettes/projectx.jpg","test", 44.5);
        creeDisques("Alien", "Ridley Scott", "SF", "upload/pochettes/alien1.jpg","test", 44.5);  
        creeDisques("Alien 2", "Ridley Scott", "SF", "upload/pochettes/alien2.jpg","test", 44.5);  
        creeDisques("Alien 3 ", "Ridley Scott", "SF", "upload/pochettes/alien3.jpg","test", 44.5);  
        creeDisques("Star Trek", "J.J. Abrams", "SF", "upload/pochettes/matrix3.jpg","test", 44.5);  
        creeDisques("Prometheus", "Ridley Scott", "SF", "upload/pochettes/prometheus.jpg","test", 44.5);  
        creeDisques("Star Wars ", "George Lucas", "SF", "upload/pochettes/sw1.jpg","test", 44.5);  
        creeDisques("Star Wars 2", "George Lucas", "SF", "upload/pochettes/sw2.jpg","test", 44.5);
       creeDisques("Star Wars 3", "George Lucas", "SF", "upload/pochettes/sw3.jpg", 44.5);  
        creeDisques("Star Wars 4", "George Lucas", "SF", "upload/pochettes/sw4.jpg", 44.5);  
        creeDisques("Star Wars 5", "George Lucas", "SF", "upload/pochettes/sw5.jpg", 44.5);  
        creeDisques("Star Wars 6", "George Lucas", "SF", "upload/pochettes/sw6.jpg", 44.5);
        creeDisques("Clone Wars", "Lennon1xc", "jlennonsdfs", "upload/pochettes/cw.jpg", 44.5);  
        creeDisques("300", "Zack Snyder", "jlennonsdfsdf", "upload/pochettes/300.jpg", 44.5);  
        creeDisques("Wall E", "Lennonsdfs", "jlennonsdfs", "upload/pochettes/miss.jpg", 44.5);  
        creeDisques("Là haut", "Lennon", "jlennon", "upload/pochettes/miss.jpg", 44.5);
        creeDisques("Pirates des Caraïbes", "Lennon1xc", "jlennonsdfs", "upload/pochettes/miss.jpg", 44.5);  
        creeDisques("Pirates des Caraïbes 2", "Lennondfsdf", "jlennonsdfsdf", "upload/pochettes/miss.jpg", 44.5);  
        creeDisques("Pirates des Caraïbes 3", "Lennonsdfs", "jlennonsdfs", "upload/pochettes/miss.jpg", 44.5);  
        creeDisques("Charlie et la chocolaterie", "Lennon", "jlennon", "upload/pochettes/miss.jpg", 44.5);
        creeDisques("L'etranger", "Lennon1xc", "jlennonsdfs", "upload/pochettes/miss.jpg", 44.5);  
        creeDisques("Jeux d'enfants", "Lennondfsdf", "jlennonsdfsdf", "upload/pochettes/miss.jpg", 44.5);  
        creeDisques("L'agence", "Lennonsdfs", "jlennonsdfs", "upload/pochettes/miss.jpg", 44.5);  
        creeDisques("L'arnacoeur", "Lennon", "jlennon", "upload/pochettes/miss.jpg", 44.5);
        creeDisques("L'auberge espagnole", "Lennon1xc", "jlennonsdfs", "upload/pochettes/miss.jpg", 44.5);  
        creeDisques("Cliffhanger", "Lennondfsdf", "jlennonsdfsdf", "upload/pochettes/miss.jpg", 44.5);  
        creeDisques("Dans la peau de John Malkovitch", "Lennonsdfs", "jlennonsdfs", "upload/pochettes/miss.jpg", 44.5);  */
        
    }  
  
    public Disque creeDisques(String letitre, Collection<Realisateur> realisateur ,String genre, String pochette, Collection<Acteur> acteurs,Double prix) {   
       // Disque disqueToCreate = getDisqueFromTitre(letitre);
        //if(disqueToCreate == null){
            Disque u = new Disque(letitre, realisateur , genre, pochette, acteurs, prix);
         
            em.persist(u);  
            return u;
            
        //}else {
           // return null;
        //}     
    }  
  
    public Collection<Disque> getAllDisques() {  
        // Exécution d'une requête équivalente à un select *  
        Query q = em.createQuery("select u from Disque u");  
        return q.getResultList();
    } 
    
    public Disque getDisqueFromTitre(String letitre)  {
        try {
            Query q = em.createQuery("select u from Disque u where u.titre=:utitre").setParameter("utitre", letitre);
            return (Disque) q.getSingleResult(); 
        } catch (NoResultException e){
            return null;
        }
    }
    
    public Disque getDisqueFromRealisateur(String letitre)  {
        try {
            Query q = em.createQuery("select u from Disque u where u.realisateur=:utitre").setParameter("utitre", letitre);
            return (Disque) q.getSingleResult(); 
        } catch (NoResultException e){
            return null;
        }
    }
    public Disque getDisqueFromId(int Id) {
        try{
            Query q = em.createQuery("select u from Disque u where u.id=:uId ").setParameter("uId", Id);
            return (Disque) q.getSingleResult();
        } catch (NoResultException e){
            return null;
        }
    }
    
    public Collection<Disque> getNextDisques(int deb,int nbr) {  
        try {
            Query q = em.createQuery("select u from Disque u");  
            q.setFirstResult(deb);
            q.setMaxResults(nbr);
            return q.getResultList();
        } catch (NoResultException e){
            return null;
        }
    }
    
    public Collection<Disque> getPrevDisques(int deb,int nbr) {  
       try {
            Query q = em.createQuery("select u from Disque u");  
            q.setFirstResult(deb-nbr);
            q.setMaxResults(nbr);
            return q.getResultList();
        } catch (NoResultException e){
            return null;
        }
    }
    
        public Collection<Disque> getNextDisquesGenre(int deb,int nbr, String genre) {  
        try {
            Query q = em.createQuery("select u from Disque u where u.genre=:ugenre").setParameter("ugenre", genre);
            q.setFirstResult(deb);
            q.setMaxResults(nbr);
            return q.getResultList();
        } catch (NoResultException e){
            return null;
        }
    }
    
    public Collection<Disque> getPrevDisquesGenre(int deb,int nbr, String genre) {  
       try {
            Query q = em.createQuery("select u from Disque u where u.genre=:ugenre").setParameter("ugenre", genre);
            q.setFirstResult(deb-nbr);
            q.setMaxResults(nbr);
            return q.getResultList();
        } catch (NoResultException e){
            return null;
        }
    }
    
    public int deleteDisque(final String utitre) {
        Query q = em.createQuery("delete from Disque u where u.titre=:utitre ");
              q.setParameter("utitre", utitre);
       int deleteUser = q.executeUpdate();
       return deleteUser;
    }
    
    public int updateDisque (final String utitre, final String urealisateur, final String ugenre, final String upochette, final Double uprix) {
        Query q = em.createQuery("update Disque u set u.realisateur=:urealisateur, u.genre=:ugenre, u.pochette=:upochette, u.prix=:uprix where u.titre=:utitre ");
              q.setParameter("utitre", utitre);
              q.setParameter("urealisateur", urealisateur);
              q.setParameter("ugenre", ugenre);
              q.setParameter("upochette", upochette);
              q.setParameter("uprix", uprix);
       int deletDisque = q.executeUpdate();
       return deletDisque;
    }
    
    
    

    

    
}  
